package com.apps.java.javanote02;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;

//什么是注解
@MyAnnotation(schools = "大云汉")
public class _28注解 extends Object {
    /**
     *  注解（Java.Annotation）
     *      一、概述
     *          1.Annotation是从JDK5.0开始引入的新技术。
     *          2.Annotation的作用：
     *              （1）不是程序本身，可以对程序作出解释（这一点和注释没什么区别）
     *              （2）可以被其他程序（比如编辑器等）读取
     *          3.Annotation的格式：
     *              注解是以“@注解名”在代码中存在的，还可以添加一些参数值
     *              例如：@SuppressWarnings(Value="unchecked").
     *          4.注解在哪里使用：
     *              可以附加在package，class，method，field等上面，相当于给他们添加了额外的辅助信息，
     *              我们可以通过反射机制编程实现对这些元数据的访问。
     *
     *      二、内置注解
     *          1.@Override：
     *                  定义在java.lang.Override中，次注解只适用于修辞方法，表示一个方法声明打算
     *                  重写超类中的另一个方法声明
     *          2.@Deprecated：
     *                  定义在java.lang.Deprecated中，次注解可以用于修辞方法，属性，类，表示不
     *                  鼓励程序员使用这样的元素，通常是因为它很危险或者是存在更好的选择。
     *          3.@SuppressWarnings：
     *                  定义在java.lang.SuppressWarnings中，用来抑制编译时的警告信息，与前两个
     *                  注释有所不同，你需要添加一个参数才能正确使用，这些参数都是已经定义好的。
     *                  我们选择性的使用：
     *                   @SuppressWarnings("all")
     *                   @SuppressWarnings("unchecked")
     *                   @SuppressWarnings("unchecked","deprecation")
     *                   等等..
     *
     *      三、元注解
     *          1.  元注解的作用就是负责注解其他注解，java定义了4个标准的meta-annotation类型，他们
     *              被用来提供对其他annotation类型作说明
     *          2.  这些类型和它们所支持的类在java.lang.annotation包中可以找到。（@Target，@Retention
     *              ，@Documented，@Inherited）
     *                  .@Target：用于描述注解的使用范围（即：被描述的注解可以用在什么地方
     *                  .@Retention：表示需要在说明级别保存该注释信息，用于描述注解的生命周期
     *                                 SOURCE < CLASS < RUNTIME
     *                  .@Document：说明该注解将被包含在javadoc中
     *                  .@Inherited：说明子类可以继承父类中的该注解
     *
     *      四、自定义注解
     *          1.  使用@interface自定义注解时，自动继承了java.lang.annotation.Annotation接口
     *          2.  分析
     *              .@interface用来声明一个注解，格式：public @interface 注解名{定义内容}
     *              .其中的每个方法实际是声明了一个配置参数
     *              .方法的名称就是参数的名称
     *              .返回值类型就是参数的类型（返回值只能是基本类型，Class，String，enum)
     *              .可以通过default来声明参数的默认值
     *              .如果只有一个参数成员，一般参数名为value
     *              .注解元素必须要有值，我们定义注解元素时，经常使用空字符串，0作为默认值
     *
     *
     *
     *
     *
     *
     */

    //@Override:重写的注解
    @Override
    public String toString() {
        return super.toString();
    }

    //@Deprecated：不推荐程序员使用，但是可以使用。或者存在更好的方式
    @Deprecated
    public static void test(){
        System.out.println("Deprecated");
    }

    //@SuppressWarnings("all")：制编译时的警告信息，all为全部警告
    @SuppressWarnings("all")
    public void test02(){
        List li = new ArrayList();
    }

    //测试元注解
    //注解可以显示赋值，如果没有默认值，就必须给注解赋值
    @MyAnnotation(name = "参数",schools = {"北京大学","清华大学"})
    public void method(){

    }


    public static void main(String[] args) {

    }
}

//测试元注解

//自定义一个注解
//@Target：表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METHOD,ElementType.TYPE})

//Retention：表示我们的注解在说明地方还有效
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    //注解的参数：参数类型 + 参数名();
    String name() default "";//默认为空
    int age() default 0;
    int id() default -1;//如果默认值为-1，代表不存在，indexof，如果找不到，为-1

    String[] schools();
}